{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 循环核：参数时间共享，循环层提取时间信息\n",
    "\n",
    "    Xt————→循环核（ht）————→Yt\n",
    "      （Wxh）   （Whh）    （Why）\n",
    "    Yt = softmax( ht * Why + by )\n",
    "    ht = tanh( Xt * Wxh + ht~ * Whh + bh )\n",
    "    \n",
    "    前向传播时：记忆体内存储的状态信息ht ，在每个时刻都被刷 新，三个参数矩阵wxhwhhwhy自始至终都是固定不变的。\n",
    "    反向传播时：三个参数矩阵wxhwhhwhy被梯度下降法更新。\n",
    "    可以把ht理解为一个时序参量\n",
    "    \n",
    "### 循环核时间步展开\n",
    "\n",
    "    |X0————→循环核（h0）————→Y0\n",
    "    |  （Wxh）   （Whh）    （Why）\n",
    "    |  \n",
    "    |X1————→循环核（h1）————→Y1\n",
    "    |  （Wxh）   （Whh）    （Why）\n",
    "    |  \n",
    "    |X2————→循环核（h2）————→Y2\n",
    "    |  （Wxh）   （Whh）    （Why）\n",
    "    | \n",
    "    |X3————→循环核（h3）————→Y3\n",
    "    |  （Wxh）   （Whh）    （Why）\n",
    "    |  \n",
    "    |          ·\n",
    "    |          ·\n",
    "    |          ·\n",
    "    |  \n",
    "    |Xt————→循环核（ht）————→Yt\n",
    "    ⬇  （Wxh）   （Whh）    （Why）\n",
    "    t\n",
    "    \n",
    "    循环神经网络：借助循环核提取时间特征后，送入全连接网。\n",
    "    \n",
    "### 循环计算层：向输出方向生长\n",
    "\n",
    "    一个循环核 纵向连接 构成1层循环计算层\n",
    "    Xt————→循环核（ht）————→Yt\n",
    "      （Wxh）   （Whh）    （Why）\n",
    "      \n",
    "    两个不同的循环核 纵向连接 构成2层循环计算层\n",
    "    Xt————→循环核（ht）————→循环核（ht）————→Yt\n",
    "      （Wxh1）  （Whh1）   （Wxh2）  （Whh2）   （Why）\n",
    "      \n",
    "    三个不同的循环核 纵向连接 构成3层循环计算层\n",
    "    Xt————→循环核（ht）————→循环核（ht）————→循环核（ht）————→Yt\n",
    "      （Wxh1）  （Whh1）   （Wxh2）  （Whh2）   （Whx3）  （Whh3）    （Wy）\n",
    "    \n",
    "### TF描述循环计算层\n",
    "\n",
    "    tf.keras.layers.SimpleRNN(记忆体个数，activation=‘激活函数’ ， return_sequences=是否每个时刻输出ht到下一层) \n",
    "                             activation=‘激活函数’ （不写，默认使用tanh） \n",
    "                                                return_sequences=True  各时间步输出ht \n",
    "                                                return_sequences=False 仅最后时间步输出ht（默认）\n",
    "    \n",
    "    例：SimpleRNN(3, return_sequences=True)\n",
    "    return_sequences = True\n",
    "    循环核各时刻会把ht推送到到下一层\n",
    "    \n",
    "      ⬆       ⬆              ⬆         ⬆\n",
    "      |       |              |         |\n",
    "    { h0 }——→{ h1 }   ···   { ht-1 }——→{ ht }\n",
    "      ⬆  （Whh） ⬆              ⬆   （Whh ） ⬆ \n",
    "      |       |              |         |\n",
    "      |（Wxh ）  |（Wxh）···     |（Wxh ）    |（Wxh）\n",
    "      |       |              |         |\n",
    "      X0      X1              Xt-1       Xt\n",
    "    ——————————————————————————————→t\n",
    "    \n",
    "    return_sequences= False\n",
    "    循环核仅在最后一个时刻把ht推送到到下一层\n",
    "    \n",
    "                                     ⬆\n",
    "                                     |\n",
    "    { h0 }——→{ h1 }   ···   { ht-1 }——→{ ht }\n",
    "      ⬆  （Whh） ⬆              ⬆   （Whh ） ⬆ \n",
    "      |       |              |         |\n",
    "      |（Wxh ）  |（Wxh）···     |（Wxh ）    |（Wxh）\n",
    "      |       |              |         |\n",
    "      X0      X1              Xt-1       Xt\n",
    "    ——————————————————————————————→t\n",
    "    \n",
    "    API要求送入循环层的数据是三维的\n",
    "    入RNN时， x_train维度： [送入样本数， 循环核时间展开步数， 每个时间步输入特征个数]\n",
    "    \n",
    "      ⬆\n",
    "      |\n",
    "     { ht }\n",
    "      ⬆\n",
    "      |\n",
    "      Xt\n",
    "    0.4，1.7，0.6\n",
    "    0.7，0.9, 1.6\n",
    "    RNN层期待维度：[2， 1， 3]\n",
    "    \n",
    "      ⬆        ⬆        ⬆        ⬆\n",
    "      |        |        |        |\n",
    "     { ht }——→{ ht }——→{ ht }——→{ ht }\n",
    "      ⬆        ⬆        ⬆        ⬆\n",
    "      |        |        |        |\n",
    "      Xt       Xt       Xt       Xt\n",
    "    0.4，1.7   0.2，1.7   0.1，1.1   1.1，0.1\n",
    "    RNN层期待维度：[1， 4， 2]\n",
    "\n",
    "\n",
    "    \n",
    "    \n",
    "\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
